#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>



int main()
{
    pid_t id = fork();
    if(id < 0){ perror("fork:");}
    if(id == 0){//child process
        int cnt =10;
        while(cnt--){
            printf("child process:pid->%d , ppid->%d\n",getpid(),getppid());
            sleep(1);
        }
        exit(123);
    }
    else{//parent process
        while(1){
            sleep(1);//每两秒检查一次
            int status = 0;
            pid_t ret = waitpid(id, &status, WNOHANG);//非阻塞等待，当子进程没有退出，父进程不会停下来等待子进程。
            if(ret  == id){
                printf("进程等待成功！！\n");
                printf("子进程终止信号：%d， 子进程退出码：%d\n",WTERMSIG(status) ,WEXITSTATUS(status));
                printf("waitpid的返回值是：%d\n",ret);
                break;
            }
            else if(ret == 0){
                printf("子进程runing！！父进程还能执行别的代码中！！\n");
                printf("waitpid的返回值是：%d\n",ret);
            }
            else{
                printf("等待失败！！\n ");
            }
        }
    }
    return 0;
}
//int main()
//{
//    pid_t id = fork();
//
//    if(id < 0)
//    {
//        perror("fork:");
//    }
//    if(id == 0)
//    {
//        //child process
//        int cnt =10;
//        while(cnt--)
//        {
//            printf("child process:pid->%d , ppid->%d\n",getpid(),getppid());
//            sleep(1);
//        }
//        exit(123);
//    }
//    else{
//        //parent process
//        int status = 0;
//        pid_t ret = waitpid(id, &status, 0);//阻塞等待，当子进程没有退出，父进程一直停在这里等待子进程退出。
//        //pid_t ret = waitpid(id, &status, WNOHANG);//非阻塞等待，当子进程没有退出，父进程不会停下来等待子进程。
//        if(ret  == id)
//        {
//            printf("进程等待成功！！\n");
//            printf("子进程终止信号：%d， 子进程退出码：%d\n",WTERMSIG(status) ,WEXITSTATUS(status));
//        }
//    }
//    return 0;
//}
//
//
//

//
//int main()
//{
//    //printf("test makefile!!\n");
//
//    pid_t id = fork(); 
//    if(id == 0 ){
//        //child
//        int cnt =10;
//        while(cnt--)
//        {
//            printf("我是子进程：PID：%d， PPID：%d\n", getpid(),getppid());
//            sleep(1);
//        }
//        exit(100);
//    }else{
//        int status = 0;
//        pid_t ret = wait(&status);
//        if(WIFEXITED(status))
//        {
//            printf("正常退出!!\n");
//            printf("等待的子进程pid：%d , 子进程exit code: %d\n",ret, WEXITSTATUS(status));
//        }
//        if(WIFSIGNALED(status)){
//            printf("异常退出！！\n");
//            printf("等待的子进程pid：%d ，子进程终止信号：%d\n",ret , WTERMSIG(status));
//        }
//        //printf("等待完成，我等待的进程是：%d ,终止信号是：%d, 退出码是：%d \n",ret,(status&0x7F),(status>>8)&0xFF);
//        //printf("等待完成，我等待的进程是：%d\n", ret);
//    }
//    return 0;
//}
